package com.jt.service;

import com.jt.vo.ImageVo;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements  FileService {

    private String localDir = "/usr/local/src/images";

    private  String preUrlPath= "http://image.jt.com";
    /**
     * 1.校验后台文件上传的类型    jpg/png/gif
     * 2.应该校验文件是否为恶意的程序.
     * 3.提高检索效率分目录存储  .
     * (1). hash方式xx/xx/xx/xx分布不均
     * (2).日期格式yyyy/MM/dd目录不断增长
     * 4.防止文件重名  --  UUID.jpg
     *
     * @param file
     * @return
     */
    @Override
    public ImageVo upload(MultipartFile file) {
        //1.校验后台文件上传的类型
        String fileName = file.getOriginalFilename();

        //字符大小写干扰正则的判断将所有的文件转化为小写字母
        fileName = fileName.toLowerCase();//aaa.JPG

        if (!fileName.matches("^.+\\.(jpg|png|gif)$")) {
            return null;
        }
        //2.校验文件是否为恶意的程序-----判断依据宽度和高度

        try {
            //该对象是用来专门操作图片的API-----把文件转化为文件对象,如果文件原本就是图片文件就会成功的转为图片文件
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();

            if (height == 0 || width == 0) {
                return null;
            }

            //3. 分目录存储文件: ---- 日期格式yyyy/MM/dd目录不断增长
            //3.1. 准备根目录 (提取,设置为了private属性)

            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                    .format(new Date());//时间文件夹片段

            String dirPath = localDir + dateDir;//磁盘目录+时间目录

            File dirFile = new File(dirPath);

            //3.2 判断是否要创建目录
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            }

            //4.防止图片文件重名  UUID.后缀
            String uuid = UUID.randomUUID().toString().replace("-", "");

            int index = fileName.lastIndexOf(".");
            String fileType = fileName.substring(index);
            String realFileName = uuid + fileType;//文件名+后缀

            //5.实现文件上传操作
            //5.1. 准备文件全路径---> 磁盘目录+文件目录+文件名称(UUID.jpg)
            //E:/CGBIII/CGBIIItools/vue/picture/jtadmin/2021/8/11/uuid.jpg
            String pathAll = dirPath + realFileName;
            File realFile = new File(pathAll);
            file.transferTo(realFile);
            //6.封装返回值结果
            //封装ImageVO对象  //2021/11s/11/uuid.jpg 图片路径
            String virtualPath = dateDir + realFileName;
            //封装虚拟URl地址--协议名称://域名:端口号/图片虚拟地址
            //String urlPath = "https://img.alicdn.com/imgextra/i3/847491752/O1CN01TWWX8N1OoSY8NzYqP_!!847491752.jpg";
            String urlPath = preUrlPath+virtualPath;
            //http://image.jt.com/2021/08/11/0d6096114ccb4750b04107a790eae116.png
            ImageVo imageVo = new ImageVo();
            imageVo.setFileName(realFileName).setVirtualPath(virtualPath)
                    .setUrlPath(urlPath);
            System.out.println(urlPath);
            return imageVo;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    @Override
    public void deleteFile(String virtualPath) {
          //1.准备文件的全路径真是地址: 根目录+虚拟地址
        String  path=localDir+virtualPath;
          //2.封装为文件对象
        File file=new File(path);
           //3.删除文件
        file.delete();

    }
}
